﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Data;

namespace ConfrontaTracciati.CLASSI
{
    public class CdbUtils
    {
        public SqlConnection  Conn;

        public CdbUtils()
        {


        }

        #region "Connessione: apri e chiudi"

            public bool  ApriConnessione() // string dbName)
            {
                // APRO LA CONNESSIONE AL DB
                try
                {
                    Conn = new SqlConnection ("Data Source=PXZ800651\\SQLEXPRESS;Initial Catalog=test_tracciati;Integrated Security=SSPI");
                    Conn.Open();
                    return true;
                }
                catch (Exception ex) {
                    System.Windows.Forms.MessageBox.Show("Apertura connessione al database IMPOSSIBILE : \r\n" + ex.Message, "ATTENZIONE", System.Windows.Forms.MessageBoxButtons.OK,System.Windows.Forms.MessageBoxIcon.Error);
                    return false;
                }
            }

            public bool ChiudiConnessione()
            {
                // CHIUDO LA CONNESSIONE AL DB
                try
                {
                    if (Conn.State == ConnectionState.Open) Conn.Close();
                    return true;
                }
                catch (Exception ex) 
                {
                    System.Windows.Forms.MessageBox.Show("Chiusura connessione al database IMPOSSIBILE : \r\n" + ex.Message, "ATTENZIONE", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); 
                    return false;
                }
            }
        #endregion 

        public int CreaTabella(Ctracciato tracciato)
        {
            try
            {
                using (SqlCommand comElencoOperazioni = new SqlCommand())
                {

                    comElencoOperazioni.CommandType = CommandType.StoredProcedure; comElencoOperazioni.CommandText = "CreaTabella";
                    comElencoOperazioni.Connection = Conn;

                    // parametri sp
                    comElencoOperazioni.Parameters.Clear();
                    comElencoOperazioni.Parameters.Add("@TableDefinition", SqlDbType.VarChar).Value = tracciato.nome_tabella + "_TARGET";
                    comElencoOperazioni.Parameters.Add("@HasKey", SqlDbType.Bit).Value = tracciato.UsaChiave;
                    int res = comElencoOperazioni.ExecuteNonQuery();
                    // parametri sp
                    comElencoOperazioni.Parameters.Clear();
                    comElencoOperazioni.Parameters.Add("@TableDefinition", SqlDbType.VarChar).Value = tracciato.nome_tabella + "_MIRROR";
                    comElencoOperazioni.Parameters.Add("@HasKey", SqlDbType.Bit).Value = tracciato.UsaChiave;
                    res += comElencoOperazioni.ExecuteNonQuery();
                    
                    return res;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public int SvuotaTabella(string NomeTabella)
        {
            try
            {
                using (SqlCommand comElencoOperazioni = new SqlCommand())
                {

                    comElencoOperazioni.CommandType = CommandType.StoredProcedure; comElencoOperazioni.CommandText = "TruncateTable";
                    comElencoOperazioni.Connection = Conn;

                    // parametri sp
                    comElencoOperazioni.Parameters.Clear();
                    comElencoOperazioni.Parameters.Add("@TableName", SqlDbType.VarChar).Value = NomeTabella + "_TARGET";
                    int res = comElencoOperazioni.ExecuteNonQuery();
                    // parametri sp
                    comElencoOperazioni.Parameters.Clear();
                    comElencoOperazioni.Parameters.Add("@TableName", SqlDbType.VarChar).Value = NomeTabella + "_MIRROR";
                    res += comElencoOperazioni.ExecuteNonQuery();
                    
                    return res;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public int ConfrontaTabella(ref Ctracciato pTracciato)
        {
            try
            {
                using (SqlCommand comElencoOperazioni = new SqlCommand())
                {

                    comElencoOperazioni.CommandType = CommandType.StoredProcedure; 
                    comElencoOperazioni.CommandText = "ConfrontaTabelle";
                    comElencoOperazioni.Connection = Conn;

                    // parametri sp
                    comElencoOperazioni.Parameters.Clear();

                    
                    comElencoOperazioni.Parameters.Add("@CampoChiaveName", SqlDbType.VarChar).Value = (pTracciato.UsaChiave) ? "chiave" : "ID";
                    comElencoOperazioni.Parameters.Add("@CampoConfrontoName", SqlDbType.VarChar).Value = "rec";
                    comElencoOperazioni.Parameters.Add("@TableNameUNI", SqlDbType.VarChar).Value = pTracciato.nome_tabella + "_TARGET";
                    comElencoOperazioni.Parameters.Add("@TableNameOLD", SqlDbType.VarChar).Value = pTracciato.nome_tabella + "_MIRROR";
                    comElencoOperazioni.Parameters.Add("@TableNameResult", SqlDbType.VarChar).Value = pTracciato.nome_tabella + "_RES";
                    comElencoOperazioni.Parameters.Add("@Orfane", SqlDbType.Int).Value = 0;
                    comElencoOperazioni.Parameters["@Orfane"].Direction = ParameterDirection.Output;
                    comElencoOperazioni.Parameters.Add("@Errate", SqlDbType.Int).Value = 0;
                    comElencoOperazioni.Parameters["@Errate"].Direction = ParameterDirection.Output;

                    int res = comElencoOperazioni.ExecuteNonQuery();
                    pTracciato.Orfane = (int)comElencoOperazioni.Parameters["@Orfane"].Value;
                    pTracciato.Errate = (int)comElencoOperazioni.Parameters["@Errate"].Value;

                    comElencoOperazioni.Connection.Close(); 
                    return res;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public bool CaricaTabella(string NomeTabella, string chiave, string record,ref SqlTransaction pTrans)
        {
            try
            {
                var command = new StringBuilder();
                command.Append("INSERT INTO " + NomeTabella);
                command.Append("(chiave, rec) ");
                command.Append("VALUES ");
                command.Append("( @chiave, @record )");

                var cmd = Conn.CreateCommand();
                cmd.Connection = Conn;
                cmd.CommandText = command.ToString();
                cmd.CommandType = CommandType.Text; 
                cmd.Transaction = pTrans;
                cmd.Parameters.Clear();
                
                cmd.Parameters.Add("@chiave", SqlDbType.VarChar).Value = chiave;
                cmd.Parameters.Add("@record", SqlDbType.VarChar).Value = record;

                cmd.ExecuteNonQuery();
                return true;
            }
            catch (Exception ex) {

                throw ex;          
            
            }           
        }

        public DataTable LeggiTabella(string tabella)
        {
            try
            {
                string query = "select * from " + tabella;

                //create an OleDbDataAdapter to execute the query
                SqlDataAdapter dAdapter = new SqlDataAdapter(query, Conn);

                //create a command builder
                var cBuilder = new SqlCommandBuilder(dAdapter);

                //create a DataTable to hold the query results
                var dt = new DataTable();
                dAdapter.Fill(dt);

                return dt;
            }
            catch (Exception ex) { throw ex; }
        }


    }
}
